/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package serversocket;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * Clase que maneja los hilos de conexión con el cliente
 * 
 * @author Carlos
 */
public class ClientConexThread extends Thread {

    private int puerto;
    private String nombreUsuario;
    
    /**
     * Constructor personalizado de la clase
     * 
     * @param usuario usuario del cliente
     * @param nuevoPuerto puerto desde el cual se comunica el cliente con el servidor
     */
    ClientConexThread(String usuario,int nuevoPuerto) {
        this.puerto = nuevoPuerto;
        this.nombreUsuario = usuario;
    }
 
    /**
     * Se crea el hilo para conexión
     * 
     */
    @Override
    public void run(){
        String User;
        ServerSocket servicio;
        Socket socketServicio = null;
        int fase = 0;
        while (fase != -1){
        try {
            servicio = new ServerSocket(this.puerto);
            socketServicio = null;        
            socketServicio = servicio.accept();    
                InputStream llegada = socketServicio.getInputStream();
                PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);
                BufferedReader entrada = new BufferedReader(new InputStreamReader(socketServicio.getInputStream()));
                String llego = entrada.readLine();
                if (llego.equals("Hola")){
                    salida.println("Ok");
                }
                if(XmlParser.extraerContenido(llego).equals("Descarga")){
                    User = entrada.readLine();
                    String nombreArchivo = entrada.readLine();
                    PrintStream envio = new PrintStream(socketServicio.getOutputStream());
                    FileInputStream origen = new FileInputStream(System.getProperty("user.dir")+"/archivos/"+User+"/"+nombreArchivo);
                    byte[] buffer = new byte[1024];
                    int len;
                    while (1 == 1) {
                        len = origen.read(buffer);
                        //llego = entrada.readLine();
                        if (len <= 0) {
                            envio.close();
                            System.out.println("se mando completo");
                            break;
                        } else {
                            envio.write(buffer, 0, len);
                        }
                    }          
                }
                if(XmlParser.extraerContenido(llego).equals("Lista")){
                    User = XmlParser.extraerContenido(entrada.readLine());
                    PrintStream envio = new PrintStream(socketServicio.getOutputStream());
                    FileInputStream origen = new FileInputStream(System.getProperty("user.dir")+"/archivos/"+User+"/ArchivosUsuario.xml");
                    byte[] buffer = new byte[1024];
                    int len;
                    while (1 == 1) {
                        len = origen.read(buffer);
                        //llego = entrada.readLine();
                        if (len <= 0) {
                            envio.close();
                            System.out.println("se mando completo");
                            break;
                        } else {
                            envio.write(buffer, 0, len);
                        }
                    }
                }
                if (XmlParser.extraerContenido(llego).equals("Envio")){
                    salida.println("Ok");
                    User = entrada.readLine();
                    String nombreArchivo = entrada.readLine();
                    String path = System.getProperty("user.dir") +"/archivos/"+User+"/"+nombreArchivo;
                    FileOutputStream destino = new FileOutputStream(path);
                    byte[] buffer = new byte[1024];
                    int len;                    
                    while (1 == 1) {
                        // try {
                        len = llegada.read(buffer);
                        if (len <= 0) {
                            System.out.println("Llego completo");
                            fase = -1;
                            break;
                        } else {
                            destino.write(buffer, 0, len);
                        }
                }
                    try {
                        destino.close();
                    } catch (IOException ex) {
                        Logger.getLogger(ClientConexThread.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try{
                        ArrayList<String> lista= new ArrayList<String>();
                        File archivo = new File (System.getProperty("user.dir") + "/archivos/"+User+"/ArchivosUsuario.xml");
                        FileReader fr = new FileReader (archivo);
                        BufferedReader br = new BufferedReader(fr);
                        String linea;
                        lista.add(linea = br.readLine());
                        lista.add("  <servidor.Archivo>");
                        lista.add("  <Nombre>"+nombreArchivo+"</Nombre>");
                        lista.add("<Ruta>NULL</Ruta>");
                        lista.add("</servidor.Archivo>");
                        while(1==1){ 
                            linea = br.readLine();
                            if (linea != null){                    
                             lista.add(linea);
                            }else{
                                break;
                            }
                        } fr.close();
                        
                         FileWriter fichero = null;
                         PrintWriter pw = null;
                            try
                            {
                                fichero = new FileWriter(System.getProperty("user.dir") + "/archivos/"+User+"/ArchivosUsuario.xml");
                                pw = new PrintWriter(fichero);

                                for (String este : lista) {
                                    pw.println(este);
                                }
                                pw.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                    }catch(Exception e){
                        System.out.println("Error al escribir en la lista del usuario");
                        System.out.println(e.getMessage());
                    }
                    try{
                        ArrayList<String> lista= new ArrayList<String>();
                        File archivo = new File (System.getProperty("user.dir") + "/ListaArchivos.xml");
                        FileReader fr = new FileReader (archivo);
                        BufferedReader br = new BufferedReader(fr);
                        String linea;
                        lista.add(linea = br.readLine());
                        lista.add("  <servidor.Archivo>");
                        lista.add("  <Nombre>"+nombreArchivo+"</Nombre>");
                        lista.add("<Ruta>"+System.getProperty("user.dir")+"/archivos/"+this.nombreUsuario+"/"+nombreArchivo+"</Ruta>");
                        lista.add("</servidor.Archivo>");
                        while(1==1){ 
                            linea = br.readLine();
                            if (linea != null){                    
                             lista.add(linea);
                            }else{
                                break;
                            }
                        } fr.close();
                        
                         FileWriter fichero = null;
                         PrintWriter pw = null;
                            try
                            {
                                fichero = new FileWriter(System.getProperty("user.dir") + "/archivos/"+User+"/ArchivosUsuario.xml");
                                pw = new PrintWriter(fichero);

                                for (String este : lista) {
                                    pw.println(este);
                                }
                                pw.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                    }catch(Exception e){
                        System.out.println("Error al escribir en la lista general");
                        System.out.println(e.getMessage());
                    }
                    if (fase == -1){
                        llegada.close();
                        salida.close();
                        socketServicio.close();
                        try {
                            this.finalize();
                        } catch (Throwable ex) {
                            Logger.getLogger(ClientConexThread.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                    
                }
            } catch (IOException ex) {
                fase = -1;
                System.out.println("Se cayó el socket del cliente");
                System.out.println(ex.getMessage());
            }
        }
    }
    
    
}
